package com.petdog.common.util;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.servlet.http.HttpServletResponse;

/**
 * CSV文件处理工具类
 */
public class CSVUtil {

    /**
     * 读取CSV文件内容
     * @param file CSV文件
     * @param hasHeader 是否包含表头
     * @return CSV文件内容列表
     */
    public static List<String[]> readCSV(File file, boolean hasHeader) {
        List<String[]> result = new ArrayList<>();
        try (BufferedReader reader = new BufferedReader(
                new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8))) {
            String line;
            int lineNum = 0;
            
            while ((line = reader.readLine()) != null) {
                lineNum++;
                // 跳过表头
                if (hasHeader && lineNum == 1) {
                    continue;
                }
                
                String[] values = parseCSVLine(line);
                if (values != null && values.length > 0) {
                    result.add(values);
                }
            }
        } catch (IOException e) {
            throw new RuntimeException("读取CSV文件失败: " + e.getMessage(), e);
        }
        return result;
    }

    /**
     * 写入数据到CSV文件
     * @param data 要写入的数据，每行一个String数组
     * @param headers CSV文件表头
     * @param outputStream 输出流
     */
    public static void writeCSV(List<String[]> data, String[] headers, OutputStream outputStream) {
        try (BufferedWriter writer = new BufferedWriter(
                new OutputStreamWriter(outputStream, StandardCharsets.UTF_8))) {
            // 写入BOM，确保Excel能正确识别UTF-8编码
            writer.write("\ufeff");
            
            // 写入表头
            if (headers != null && headers.length > 0) {
                writer.write(formatCSVLine(headers));
                writer.newLine();
            }
            
            // 写入数据
            for (String[] row : data) {
                if (row != null) {
                    writer.write(formatCSVLine(row));
                    writer.newLine();
                }
            }
            
            writer.flush();
        } catch (IOException e) {
            throw new RuntimeException("写入CSV文件失败: " + e.getMessage(), e);
        }
    }

    /**
     * 格式化CSV行数据
     */
    private static String formatCSVLine(String[] values) {
        StringBuilder line = new StringBuilder();
        boolean first = true;
        
        for (String value : values) {
            if (first) {
                first = false;
            } else {
                line.append(',');
            }
            
            // 如果值包含逗号、引号或换行符，需要用引号包裹
            if (value != null && (value.contains(",") || value.contains("\""))) {
                // 对引号进行转义，将单个引号替换为两个引号
                value = value.replace("\"", "\"\"");
                line.append('"').append(value).append('"');
            } else {
                line.append(value != null ? value : "");
            }
        }
        
        return line.toString();
    }

    /**
     * 解析CSV文件的一行
     */
    private static String[] parseCSVLine(String line) {
        if (line == null || line.trim().isEmpty()) {
            return null;
        }

        List<String> values = new ArrayList<>();
        StringBuilder currentValue = new StringBuilder();
        boolean inQuotes = false;

        for (int i = 0; i < line.length(); i++) {
            char c = line.charAt(i);
            
            if (c == '"') {
                // 处理引号
                if (inQuotes && i + 1 < line.length() && line.charAt(i + 1) == '"') {
                    // 处理两个连续的引号表示一个引号
                    currentValue.append('"');
                    i++; // 跳过下一个引号
                } else {
                    inQuotes = !inQuotes;
                }
            } else if (c == ',' && !inQuotes) {
                // 逗号分隔符，且不在引号内
                values.add(currentValue.toString().trim());
                currentValue.setLength(0);
            } else {
                currentValue.append(c);
            }
        }

        // 添加最后一个值
        values.add(currentValue.toString().trim());

        return values.toArray(new String[0]);
    }

    /**
     * 检查CSV文件是否有效
     */
    public static boolean isValidCSVFile(File file) {
        if (file == null || !file.exists() || !file.isFile()) {
            return false;
        }
        
        // 检查文件大小（这里限制为10MB）
        if (file.length() > 10 * 1024 * 1024) {
            return false;
        }
        
        // 检查文件扩展名
        String fileName = file.getName().toLowerCase();
        return fileName.endsWith(".csv");
    }
    
    /**
     * 创建带有时间戳的CSV文件名
     * @param baseName 基础文件名
     * @return 带时间戳的文件名
     */
    public static String createTimestampedFileName(String baseName) {
        String timestamp = java.time.LocalDateTime.now()
                .format(java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss"));
        return baseName + "_" + timestamp + ".csv";
    }

    /**
     * 设置CSV文件下载的HTTP响应头
     * @param response HTTP响应对象
     * @param fileName 文件名
     * @throws UnsupportedEncodingException 编码异常
     */
    public static void setCSVResponseHeaders(HttpServletResponse response, String fileName)
            throws UnsupportedEncodingException {
        response.setContentType("text/csv; charset=UTF-8");
        response.setCharacterEncoding("UTF-8");
        String encodedFileName = java.net.URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%");
        response.setHeader("Content-disposition", "attachment;filename*=UTF-8''" + encodedFileName);
    }
}